home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / glibc108.gz / glibc108 / glibc-1.08.1 / sysdeps / generic / waitstatus.h < prev    next >
C/C++ Source or Header  |  1994-01-24  |  3KB  |  104 lines

  1. /* Definitions of status bits for `wait' et al.
  2. Copyright (C) 1992, 1994 Free Software Foundation, Inc.
  3. This file is part of the GNU C Library.
  4.  
  5. The GNU C Library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Library General Public License as
  7. published by the Free Software Foundation; either version 2 of the
  8. License, or (at your option) any later version.
  9.  
  10. The GNU C Library is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13. Library General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Library General Public
  16. License along with the GNU C Library; see the file COPYING.LIB.  If
  17. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  18. Cambridge, MA 02139, USA.  */
  19.  
  20. /* Everything extant so far uses these same bits.  */
  21.  
  22. #ifndef    _WAITSTATUS_H
  23. #define    _WAITSTATUS_H
  24.  
  25. /* If WIFEXITED(STATUS), the low-order 8 bits of the status.  */
  26. #define    __WEXITSTATUS(status)    (((status) & 0xff00) >> 8)
  27.  
  28. /* If WIFSIGNALED(STATUS), the terminating signal.  */
  29. #define    __WTERMSIG(status)    ((status) & 0x7f)
  30.  
  31. /* If WIFSTOPPED(STATUS), the signal that stopped the child.  */
  32. #define    __WSTOPSIG(status)    __WEXITSTATUS(status)
  33.  
  34. /* Nonzero if STATUS indicates normal termination.  */
  35. #define    __WIFEXITED(status)    (__WTERMSIG(status) == 0)
  36.  
  37. /* Nonzero if STATUS indicates termination by a signal.  */
  38. #ifdef    __GNUC__
  39. #define    __WIFSIGNALED(status)                              \
  40.   (__extension__ ({ int __stat = (status);                      \
  41.             !__WIFSTOPPED(__stat) && !__WIFEXITED(__stat); }))
  42. #else    /* Not GCC.  */
  43. #define    __WIFSIGNALED(status)    (!__WIFSTOPPED(status) && !__WIFEXITED(status))
  44. #endif    /* GCC.  */
  45.  
  46. /* Nonzero if STATUS indicates the child is stopped.  */
  47. #define    __WIFSTOPPED(status)    (((status) & 0xff) == 0x7f)
  48.  
  49. /* Nonzero if STATUS indicates the child dumped core.  */
  50. #define    __WCOREDUMP(status)    ((status) & __WCOREFLAG)
  51.  
  52. /* Macros for constructing status values.  */
  53. #define    __W_EXITCODE(ret, sig)    ((ret) << 8 | (sig))
  54. #define    __W_STOPCODE(sig)    ((sig) << 8 | 0x7f)
  55. #define    __WCOREFLAG        0x80
  56.  
  57.  
  58. #ifdef    __USE_BSD
  59.  
  60. #include <endian.h>
  61.  
  62. union wait
  63.   {
  64.     struct
  65.       {
  66. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  67.     unsigned int __w_termsig:7; /* Terminating signal.  */
  68.     unsigned int __w_coredump:1; /* Set if dumped core.  */
  69.     unsigned int __w_retcode:8; /* Return code if exited normally.  */
  70.     unsigned int:16;
  71. #endif                /* Little endian.  */
  72. #if    __BYTE_ORDER == __BIG_ENDIAN
  73.     unsigned int:16;
  74.     unsigned int __w_retcode:8;
  75.     unsigned int __w_coredump:1;
  76.     unsigned int __w_termsig:7;
  77. #endif                /* Big endian.  */
  78.       } __wait_terminated;
  79.     struct
  80.       {
  81. #if    __BYTE_ORDER == __LITTLE_ENDIAN
  82.     unsigned int __w_stopval:8; /* W_STOPPED if stopped.  */
  83.     unsigned int __w_stopsig:8; /* Stopping signal.  */
  84.     unsigned int:16;
  85. #endif                /* Little endian.  */
  86. #if    __BYTE_ORDER == __BIG_ENDIAN
  87.     unsigned int:16;
  88.     unsigned int __w_stopsig:8; /* Stopping signal.  */
  89.     unsigned int __w_stopval:8; /* W_STOPPED if stopped.  */
  90. #endif                /* Big endian.  */
  91.       } __wait_stopped;
  92.   };
  93.  
  94. #define    w_termsig    __wait_terminated.__w_termsig
  95. #define    w_coredump    __wait_terminated.__w_coredump
  96. #define    w_retcode    __wait_terminated.__w_retcode
  97. #define    w_stopsig    __wait_stopped.__w_stopsig
  98. #define    w_stopval    __wait_stopped.__w_stopval
  99.  
  100. #endif    /* Use BSD.  */
  101.  
  102.  
  103. #endif    /* waitstatus.h */
  104.